package mpascal.version0;

// esta � a classe do CUP que usamos no lugar da classe Symbol
// j� para o lugar da classe sym, o CUP gera a classe sym

// comando para gerar o Lexer ~$ java -jar ../../../lib/JFlex.jar LexerOriginal.flex 

import java_cup.runtime.*;

%%

%class Lexer
%public
%cup
%line
%column


whiteSpace=([ \n\t\f\r]+)
letra=[a-zA-Z]
numero=[0-9]

// **** outra defini��es para numeros especiais
//inteiro={numero}+
//real={numero}+ ("."{numero}+)*
//palavra={letra}+ (","{letra}}+)*

%%

{whiteSpace} { 
	// Caracteres ignorados.
	// Nenhum Symbol � retornado.
}

//**** especificacoes do prof e mais definicoes de macros *****

";" { return new Symbol(sym.PT_VIRG); }
"+" { return new Symbol(sym.MAIS); }
"-" { return new Symbol(sym.MENOS); }
"*" { return new Symbol(sym.VEZES); }
"/" { return new Symbol(sym.DIVIDE); }
"(" { return new Symbol(sym.ABRE_P); }
")" { return new Symbol(sym.FECHA_P); }

"."  { return new Symbol(sym.PT); }
","  { return new Symbol(sym.VIRG); }
":"  { return new Symbol(sym.DOIS_PT); }
"<"  { return new Symbol(sym.MENOR); }
">"  { return new Symbol(sym.MAIOR); }
"="  { return new Symbol(sym.COMPARA); }
":=" { return new Symbol(sym.ATRIBUI); }
"<>" { return new Symbol(sym.DIFF); }
"<=" { return new Symbol(sym.MENOR_IG); }
">=" { return new Symbol(sym.MAIOR_IG); }

"def"      { return new Symbol(sym.DEF); }

"begin"	   { return new Symbol(sym.BEGIN); }
"end"	   { return new Symbol(sym.END); }
"div"	   { return new Symbol(sym.DIV); }
"and"	   { return new Symbol(sym.AND); }
"or"	   { return new Symbol(sym.OR); }
"not"	   { return new Symbol(sym.NOT); }


{letra}+   { return new Symbol(sym.IDENTIFICADOR, yytext()); }
{numero}+  { return new Symbol(sym.NUMERO, yytext()); }

// novos tipos
//{real}     { return new Symbol(sym.REAL, yytext()); }
//{palavra}  { return new Symbol(sym.LETRA); }




"//"[^\n]* {
	// Coment�rios de linha.
	// N�o retorna Symbol.
}

// **** mais defini��es ****
"/*"([^*]|[*]+[^/])*"*/" { 
	// coment�rio de multiplas linhas
}

. { 
    // Casa com qualquer caracter que n�o casar com as expressoes anteriores.
    System.out.println("Illegal character : " + yytext());
    return new Symbol(sym.error);
}

<<EOF>> {
	// Casa com o fim do arquivo apenas.
	return new Symbol(sym.EOF);
}
